import axios, { AxiosInstance } from 'axios';
import NProgress from 'nprogress';
import 'nprogress/nprogress.css'; // 引入样式
import { ElMessage } from 'element-plus';
import router from '@/router';
import { useAuthStore } from "@/stores/auth";

// 配置 NProgress 样式（可选）
NProgress.configure({
    showSpinner: true, // 右上角加载圈圈
});

// 定义接口数据类型
interface ApiResponse<T> {
    code: number;
    message: string;
    data: T;
}

// 创建 Axios 实例
const instance: AxiosInstance = axios.create({
    baseURL: import.meta.env.VITE_API_BASE_URL, // 使用 Vite 提供的环境变量
    timeout: 10000, // 请求超时时间 (毫秒)
    headers: {
        'Content-Type': 'application/json',
    },
});

// 请求拦截器
instance.interceptors.request.use(
    (config) => {
        const token = localStorage.getItem('token'); // 获取 Token
        if (token && config.headers) {
            config.headers.Authorization = `Bearer ${token}`;
        }

        // 启动 NProgress 进度条
        NProgress.start();

        return config;
    },
    (error) => {
        // 确保进度条关闭
        NProgress.done();
        return Promise.reject(error);
    }
);

// 响应拦截器
instance.interceptors.response.use(
    (response) => {
        // 关闭 NProgress 进度条
        NProgress.done();

        // 返回响应中的 data 字段
        return response.data;
    },
    (error) => {
        NProgress.done();
        // 处理网络错误或无响应
        if (!error.response) {
            ElMessage.error('网络异常，请检查连接');
            return Promise.reject(error);
        }

        const { status } = error.response;

        // Token 过期处理
        if (status === 401 || status === 403) {

            const authStore = useAuthStore()

            // 清除 Token 和用户状态
            authStore.logout();

            // 跳转登录页并携带当前路径（需登录后重定向）
            const redirectPath = encodeURIComponent(window.location.pathname);
            router.push(`/login?redirect=${redirectPath}`);

            // 提示信息
            ElMessage.warning('登录已过期，请重新登录');
        } else {
            // 其他错误提示
            const errorMessage = error.response.data?.message || error.message || '请求失败';
            ElMessage.error(errorMessage);
        }

        return Promise.reject(error);
    }
);

export default instance;